我們花了不少時間講 Spring Boot 這個框架,今天我們來聊聊另一個框架:Quarkus
Quarkus 一樣是後端開發的框架,是由 RedHat 開源的雲原生框架,主打快速 (Supersonic),小巧 (Subatomic) 的 java框架,並且很適合在雲端的環境應用。
Quarkus強調自己有以下特點:
首先,我們可以使用 SDKMAN 安裝 quarkus 工具
sdk install quarkus
安裝好之後,我們可以使用指令工具建立專案 quarkusDemo2025
quarkus create app --gradle-kotlin-dsl quarkus2025
建立好之後,我們進去專案
cd quarkus2025
如果想跑看看專案,可以執行運作指令
quarkus dev
運行成功之後,我們進入 http://localhost:8080/ 就可以看到 Quarkus 的畫面了。
我們來看看 src/main/kotlin/org/acme/GreetingResource.kt
的程式碼
package org.acme
import jakarta.ws.rs.GET
import jakarta.ws.rs.Path
import jakarta.ws.rs.Produces
import jakarta.ws.rs.core.MediaType
@Path("/hello")
class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
fun hello() = "Hello from Quarkus REST"
}
語法和 Spring Boot 類似,都是使用 annotation class 標記路由。
quarkus 沒有自己的 ORM,所以在開發時,要搭配其他的 ORM 框架。不過 quarkus 有自己對 Hibernate ORM 的包裝套件 Panache。
安裝方式如下,加入
implementation 'io.quarkus:quarkus-hibernate-orm-panache-kotlin'
implementation 'io.quarkus:quarkus-jdbc-h2'
安裝好之後,就可以在 quarkus 內使用 ORM 了
跟前面的範例一樣,我們使用多對多關係的語法進行比較
import io.quarkus.hibernate.orm.panache.kotlin.PanacheEntity
import jakarta.persistence.*
import java.util.*
@Entity
class Student : PanacheEntity() {
var name: String? = null
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = [JoinColumn(name = "student_id")],
inverseJoinColumns = [JoinColumn(name = "course_id")]
)
var courses: MutableSet<Course> = HashSet()
}
@Entity
class Course : PanacheEntity() {
var title: String? = null
@ManyToMany(mappedBy = "courses")
var students: MutableSet<Student> = HashSet()
}
定義好之後,使用的方式如下
val math = Course().apply { title = "Math" }
val english = Course().apply { title = "English" }
val alice = Student().apply {
name = "Alice"
courses.add(math)
courses.add(english)
}
val bob = Student().apply {
name = "Bob"
courses.add(math)
}
math.persist()
english.persist()
alice.persist()
bob.persist()
val aliceFromDb = Student.find("name", "Alice").firstResult()
println("Alice's courses:")
aliceFromDb?.courses?.forEach { println(it.title) }
val mathFromDb = Course.find("title", "Math").firstResult()
println("Students in Math:")
mathFromDb?.students?.forEach { println(it.name) }
各位可以看到,利用 Panache 簡化過後的語法,和其他 Java Base 的 ORM 相比,確實比較簡單一些。
不過 ORM 這點並不是 Quarkus 最主要的特性,而是和 K8s 以及容器化服務的高度整合。
明天我們再來聊聊 quarkus 的這些特點!